package com.tianqi.config;

import com.alibaba.druid.filter.stat.StatFilter;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.ext.handler.UrlSkipHandler;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.render.ViewType;
import com.jfinal.template.Engine;
import com.jfinal.weixin.sdk.api.ApiConfigKit;
import com.tianqi.config.route.OtherRoutes;
import com.tianqi.config.route.WxRoutes;
import com.tianqi.rms.model._MappingKit;

/**
 * API引导式配置
 */
public class JfinalConfig extends JFinalConfig {

	public static DruidPlugin createDruidPlugin() {
		String jdbcUrl = PropKit.get("jdbcUrl");
		String user = PropKit.get("user");
		String password = PropKit.get("password");
		// 配置druid数据连接池插件
		DruidPlugin dp = new DruidPlugin(jdbcUrl, user, password);
		// 配置druid监控
		dp.addFilter(new StatFilter());
		return dp;
	}
	/**
	 * 如果生产环境配置文件存在，则优先加载该配置，否则加载开发环境配置文件
	 * @param pro 生产环境配置文件
	 * @param dev 开发环境配置文件
	 */
	public void loadProp(String pro, String dev) {
		try {
			PropKit.use(pro);
		}
		catch (Exception e) {
			PropKit.use(dev);
		}
	}

	@Override
	public void configConstant(Constants me) {
		loadProp("a_little_config_pro.txt", "a_little_config.txt");
		me.setDevMode(PropKit.getBoolean("devMode", true));
		me.setEncoding("utf-8");
		me.setViewType(ViewType.JSP);
		// ApiConfigKit 设为开发模式可以在开发阶段输出请求交互的 xml 与 json 数据
		ApiConfigKit.setDevMode(me.getDevMode());
	}

	@Override
	public void configRoute(Routes me) {
		// 微信相关
		me.add(new WxRoutes());
		me.add(new OtherRoutes());
	}

	@Override
	public void configEngine(Engine me) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void configPlugin(Plugins me) {
		DruidPlugin dbPlugin = new DruidPlugin(PropKit.get("jdbcUrl").trim(), 
				PropKit.get("user").trim(), PropKit.get("password").trim());
		dbPlugin.set(10, 100, 1000);
		dbPlugin.setMaxWait(20000);
		dbPlugin.setTimeBetweenEvictionRunsMillis(60000);
		dbPlugin.setMinEvictableIdleTimeMillis(300000);
		dbPlugin.setValidationQuery("SELECT 'x'");
		dbPlugin.setTestWhileIdle(true);
		dbPlugin.setTestOnBorrow(true);
		dbPlugin.setTestOnReturn(false);
		me.add(dbPlugin);
		// 配置ActiveRecord插件 
		ActiveRecordPlugin arp = new ActiveRecordPlugin("mysql",dbPlugin);
		me.add(arp);
		// 配置大小写不敏感
		arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));
		_MappingKit.mapping(arp);
		com.tianqi.rms.model.business._MappingKit.mapping(arp);
		arp.setShowSql(true);
	}

	@Override
	public void configInterceptor(Interceptors me) {
		// 全局拦截器
		
	}

	@Override
	public void configHandler(Handlers me) {

		me.add(new UrlSkipHandler(".+\\.\\w{1,4}", false)); //忽略spring控制器等其他请求
	}

	@Override
	public void afterJFinalStart() {
		WeixinMsgController msg= new WeixinMsgController();
		ApiConfigKit.putApiConfig(msg.getApiConfig());
//		
//		ApiConfig ac = new ApiConfig();
//        // 配置微信 API 相关参数
//        ac.setToken(PropKit.get("token"));
//        ac.setAppId(PropKit.get("appId"));
//        ac.setAppSecret(PropKit.get("appSecret"));
//
//        /**
//         *  是否对消息进行加密，对应于微信平台的消息加解密方式：
//         *  1：true进行加密且必须配置 encodingAesKey
//         *  2：false采用明文模式，同时也支持混合模式
//         */
//        ac.setEncryptMessage(PropKit.getBoolean("encryptMessage", false));
//        ac.setEncodingAesKey(PropKit.get("encodingAesKey", "setting it in config file"));
//        ApiConfigKit.putApiConfig(ac);
//        ApiConfigKit.setThreadLocalAppId(PropKit.get("appId"));
	}

}